在上一個單元是將元件傳出資料給上層,但還是必須要透過一個按鈕才可以觸發事件,能不能有自動偵測的方式做到?
這個單元就要來繼續討論元件,元件可以自動把資料傳出給上層。
首先宣告一個元件檔案 components/Input.vue:
<template>
<input type="text" />
</template>
<script>
export default {
name: 'Input',
};
</script>
要將資料自動傳出,必須要宣告 props:
<template>
<input type="text" />
</template>
<script>
export default {
name: 'Input',
props: {
modelValue: String, // modelValue 為系統名稱,不能自由命名
},
};
</script>
這裡要注意的是 modelValue 為系統名稱,不能自由命名。
接著在 input
內宣告 :value
指定這個 modelValue
,等於是先將 input
內輸入的資料暫存起來。然後再透過@input="$emit('update:modelValue', $event.target.value)"
這一段長長的指令將內容更新給上層。
<template>
<input
type="text"
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
/>
</template>
<script>
export default {
name: 'Input',
props: {
modelValue: String,
},
};
</script>
$emit
可以在元件內發出事件,而這裡帶入的事件就是 update:modelValue
,也就是表示當 modelValue
被更新時,會觸發這個事件,最後再使用 @input
來偵測是否有輸入內容。
回到 App.vue,宣告一個變數 name,然後直接使用 v-model
來綁定元件與變數 name 即可。
<template>
{{ name }}
<Input v-model="name" />
</template>
<script>
import Input from './components/Input.vue';
export default {
name: 'App',
components: {
Input,
},
data() {
return {
name: '',
};
},
};
</script>
Vue3 - 從零開始學 - Day16 [完]